/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.webhomesites.locacao.presenter;

import br.com.webhomesites.locacao.contracts.*;
import br.com.webhomesites.locacao.model.ItemLocacaoModel;
import br.com.webhomesites.locacao.model.ItensLocacaoTableModel;
import br.com.webhomesites.locacao.model.LocacaoModel;
import br.com.webhomesites.locacao.presenter.LocacaoPresenterActionListeners.AlterarActionListener;
import br.com.webhomesites.locacao.presenter.LocacaoPresenterActionListeners.CampoKeyListener;
import br.com.webhomesites.locacao.presenter.LocacaoPresenterActionListeners.CancelarItemLocacaoActionListener;
import br.com.webhomesites.locacao.presenter.LocacaoPresenterActionListeners.CancelarLocacaoActionListener;
import br.com.webhomesites.locacao.presenter.LocacaoPresenterActionListeners.ComboStateListener;
import br.com.webhomesites.locacao.presenter.LocacaoPresenterActionListeners.EnterListener;
import br.com.webhomesites.locacao.presenter.LocacaoPresenterActionListeners.InserirItemLocacaoActionListener;
import br.com.webhomesites.locacao.presenter.LocacaoPresenterActionListeners.InserirLocacaoActionListener;
import br.com.webhomesites.locacao.presenter.LocacaoPresenterActionListeners.RemoverItemLocacaoActionListener;
import br.com.webhomesites.locacao.presenter.LocacaoPresenterActionListeners.SairActionListener;
import br.com.webhomesites.locacao.presenter.LocacaoPresenterActionListeners.SalvarItemLocacaoActionListener;
import br.com.webhomesites.locacao.presenter.LocacaoPresenterActionListeners.SalvarLocacaoActionListener;
import br.com.webhomesites.locacao.presenter.LocacaoPresenterActionListeners.TableClientesMouseListener;
import br.com.webhomesites.padrao.model.ClienteModel;
import br.com.webhomesites.padrao.model.ProdutoModel;
import br.com.webhomesites.padrao.utils.Strategy;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 *
 * @author Webhome
 */
public class LocacaoPresenter implements ILocacaoPresenter {
    
    private LocacaoModel locacaoModel;
    private ILocacaoDAO locacaoDAO;
    private ILocacaoView locacaoView;
    private ILocacaoBO locacaoBO;
    
    private ItemLocacaoModel itemLocacaoModel;
    private IItemLocacaoDAO itemLocacaoDAO;
    
    private ClienteModel clienteModel;
    private ProdutoModel produtoModel;
    
    List<ItemLocacaoModel> listaItens = new ArrayList<>();
    
    public final Strategy INSERT_STRATEGY = new InsertStrategy();  
    public final Strategy INSERT_ITEM_STRATEGY = new InsertItemStrategy();  
    public final Strategy REMOVE_ITEM_STRATEGY = new RemoveItemStrategy();  
    public final Strategy UPDATE_STRATEGY = new UpdateStrategy();  
    
    private Strategy operacao = INSERT_STRATEGY;
    
    public LocacaoPresenter(LocacaoModel locacaoModel, ILocacaoDAO locacaoDAO, ILocacaoView locacaoView, ItemLocacaoModel itemLocacaoModel, IItemLocacaoDAO itemLocacaoDAO, ClienteModel clienteModel, ProdutoModel produtomodel) {
        this.locacaoModel = locacaoModel;
        this.locacaoDAO = locacaoDAO;
        this.locacaoView = locacaoView;
                
        this.itemLocacaoModel = itemLocacaoModel;
        this.itemLocacaoDAO = itemLocacaoDAO;
        this.clienteModel = clienteModel;
        this.produtoModel = produtomodel;
    }
    
    @Override
    public void setUpViewListeners() {
        //locacaoView.setInserirActionListener(new InserirActionListener(this));  
        locacaoView.setRemoverItemLocacaoActionListener(new RemoverItemLocacaoActionListener(this)); 
        locacaoView.setInserirLocacaoActionListener(new InserirLocacaoActionListener(this)); 
        locacaoView.setAlterarActionListener(new AlterarActionListener(this));  
        locacaoView.setCancelarLocacaoActionListener(new CancelarLocacaoActionListener(this));  
        locacaoView.setCancelarItemLocacaoActionListener(new CancelarItemLocacaoActionListener(this));  
        locacaoView.setSalvarLocacaoActionListener(new SalvarLocacaoActionListener(this));  
        locacaoView.setSalvarItemLocacaoActionListener(new SalvarItemLocacaoActionListener(this)); 
        locacaoView.setInserirItemLocacaoActionListener(new InserirItemLocacaoActionListener(this)); 
        locacaoView.setBtnSairActionListener(new SairActionListener());
        locacaoView.setTableItensLocacaoMouseListener(new TableClientesMouseListener(this));
        
        locacaoView.setMascaraListener(new CampoKeyListener(this));
        locacaoView.setDiasLocacaoEnterListener(new EnterListener(this));
                
    }

    @Override
    public void updateModelLocacaoFromView() {
        try {
        DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        locacaoModel.setCodigoLocacao(locacaoView.getCodigoLocacao());  
        locacaoModel.setCodigoCliente(locacaoView.getCodigoCliente());
        locacaoModel.setTabelaPrecoLocacao(locacaoView.getTabelaPreco());        
        locacaoModel.setDiasLocacao(locacaoView.getDiasLocacao()); 
        locacaoModel.setDataLocacao((Date)formatter.parse(locacaoView.getDataLocacao()));
        locacaoModel.setDataPrevistaDevolucao((Date)formatter.parse(locacaoView.getDataPrevDevolucao()));
        locacaoModel.setDataDevolucao(null);
        locacaoModel.setStatucLocacao("Em Aberto");
        } catch (Exception e) {};                
        locacaoDAO.inserirLocacao(locacaoModel);
        
        System.out.println("******Listagem da Locação Inserida = " + "\n");
        System.out.println("Codigo da Locação = " + locacaoModel.getCodigoLocacao() + "\n" +
                           "Código do Cliente = " + locacaoModel.getCodigoCliente() + "\n" +
                           "Tabela de preço = " + locacaoModel.getTabelaPrecoLocacao() + "\n" +
                           "Dias Locação = " + locacaoModel.getDiasLocacao() + "\n");    
                
    }

    @Override
    public void updateViewLocacaoFromModel() {
        if (locacaoModel != null) {  
            locacaoView.setCodigoLocacao(locacaoModel.getCodigoLocacao());  
            locacaoView.setCodigoCliente(locacaoModel.getCodigoCliente());  
            locacaoView.setNomeCliente(locacaoModel.getNomeCliente());  
            //locacaoView.setDataLocacao(locacaoModel.getDataLocacao()); 
            locacaoView.setTabelaPreco(locacaoModel.getTabelaPrecoLocacao());    
            //locacaoView.setDataPrevDevolucao(locacaoModel.getDataPrevistaDevolucao());  
            locacaoView.setDiasLocacao(locacaoModel.getDiasLocacao()); 
        }
        
        else {  
            locacaoView.clearFields();  
        }
    }
    
    @Override
    public void updateModelItemFromView() {
        itemLocacaoModel.setCodigoLocacao(locacaoModel.getCodigoLocacao());
        System.out.println("Código máximo = " + itemLocacaoDAO.getMaximoCodigo(locacaoModel.getCodigoLocacao()));
        itemLocacaoModel.setCodigoItem(itemLocacaoDAO.getMaximoCodigo(locacaoModel.getCodigoLocacao()) + 1);
        itemLocacaoModel.setSerieItem(locacaoView.getSerieItemLocacao());
        itemLocacaoModel.setDescricaoItem(locacaoView.getDescricaoItemLocacao());
        itemLocacaoModel.setValorDoProduto(locacaoView.getValorProdutoLocacao());
        itemLocacaoModel.setDataDevolucao(null);
        itemLocacaoModel.setValorItem(locacaoView.getValorItemLocacao());
        itemLocacaoModel.setStatusItem(null);
        itemLocacaoModel.setCodigoProduto(locacaoView.getCodigoProduto());
                                        
        itemLocacaoDAO.inserirItemLocacao(itemLocacaoModel);
               
        System.out.println("******Listagem do Item Insediro = " + "\n");
        System.out.println("Codigo Item = " + itemLocacaoModel.getCodigoItem() + "\n" +
                           "Codigo Locacao = " + itemLocacaoModel.getCodigoLocacao() + "\n" +
                           "Serie Item Locacao = " + itemLocacaoModel.getSerieItem() + "\n" +
                           "Data Devolução = " + itemLocacaoModel.getDataDevolucao() + "\n" +
                           "Codigo Produto = " + itemLocacaoModel.getCodigoProduto() + "\n" +
                           "Status item = " + itemLocacaoModel.getStatusItem() + "\n");
   
    }
    
     @Override
    public void updateViewItemFromModel() {
        if (itemLocacaoModel != null) {  
            locacaoView.setCodigoProduto(itemLocacaoModel.getCodigoProduto());
            locacaoView.setSerieItemLocacao(itemLocacaoModel.getSerieItem());
            locacaoView.setDescricaoItemLocacao(itemLocacaoModel.getDescricaoItem());  
            locacaoView.setValorProdutoLocacao(itemLocacaoModel.getValorDoProduto());
            locacaoView.setValorItemLocacao(itemLocacaoModel.getValorItem());            
       }  
        else {  
            locacaoView.clearFields();  
        }
    }
     
    @Override
    public void updateViewItemFromProdutoModel(ProdutoModel produtoModel) {
        if (locacaoModel != null) {  
            locacaoView.setCodigoItemLocacao(produtoModel.getCodigo());
            locacaoView.setSerieItemLocacao(produtoModel.getSerie());
            
            //locacaoView.setListaProduto(produtoModel.getlistaProdutos()); 
            //locacaoView.setDescricaoItemLocacao(produtoModel.getDescricaoItem());
            switch (locacaoView.getTabelaPreco()) {
                case "Diaria":
                    locacaoView.setValorProdutoLocacao(produtoModel.getPrecoDiario());
                    break;
                case "Semanal":
                    locacaoView.setValorProdutoLocacao(produtoModel.getPrecoSemanal());
                    break;
                case "Quinzenal":
                    locacaoView.setValorProdutoLocacao(produtoModel.getPrecoQuinzenal());
                    break;
                case "Mensal":
                    locacaoView.setValorProdutoLocacao(produtoModel.getPrecoMensal());
                    break;
            }
            locacaoView.setValorItemLocacao(locacaoView.getValorProdutoLocacao() * locacaoView.getDiasLocacao());
        }  
        else {  
            locacaoView.clearFields();  
        }
    } 
    
    public void updateModelFromJTable() {  
        ItensLocacaoTableModel itensLocacaoTableModel = locacaoView.getitensLocacaoTableModel();  
          
        itemLocacaoModel = itensLocacaoTableModel.getItemLocacaoModel(locacaoView.linhaSelecionadaTableItens());  
          
        if (itemLocacaoModel != null) {  
            this.updateViewItemFromModel();  
              
            locacaoView.enableBtnRemoverItem(true);  
            //view.enableBtnRemover(true);  
        }  
        else {  
            //view.enableBtnAlterar(false);  
            locacaoView.enableBtnRemoverItem(false);  
        }  
          
        this.updateViewItemFromModel();  
    } 

    @Override
    public void novoLocacao() {
        locacaoModel = new LocacaoModel();
        locacaoView.setItensLocacaoTableModel(new ItensLocacaoTableModel(itemLocacaoDAO.selecionarTodosItens(locacaoModel.getCodigoLocacao())));
    }
    
    @Override
    public void novoItemLocacao() {
        itemLocacaoModel = new ItemLocacaoModel();
        locacaoView.setComboDescricaoProdutoItemStateChanged(new ComboStateListener(this));
        
    }

    @Override
    public void inserirLocacao() {
        
        this.updateModelLocacaoFromView(); 
        locacaoView.clearFields();
    }
    
    @Override
    public void inserirItemLocacao() {
        this.updateModelItemFromView();
        locacaoModel.setValorTotalLocacao(locacaoModel.getValorTotalLocacao() + itemLocacaoModel.getValorItem());
        locacaoView.setValorTotalLocacao(locacaoModel.getValorTotalLocacao());
        locacaoView.setItensLocacaoTableModel(new ItensLocacaoTableModel(itemLocacaoDAO.selecionarTodosItens(locacaoModel.getCodigoLocacao())));
        System.out.println(itemLocacaoDAO.selecionarTodosItens(locacaoModel.getCodigoLocacao()));
        locacaoView.refreshTableItensLocacao();
        locacaoView.clearFields();
    }

    @Override
    public void alterarLocacao() {
        this.updateModelLocacaoFromView();
    }

    @Override
    public void cancelarLocacao() {
         this.updateModelLocacaoFromView();
         this.updateModelItemFromView();
    }
    
    @Override
    public void removerItemLocacao() {
        itemLocacaoDAO.removerItemLocacao(itemLocacaoModel);
        locacaoView.setItensLocacaoTableModel(new ItensLocacaoTableModel(itemLocacaoDAO.selecionarTodosItens(locacaoModel.getCodigoLocacao())));
        System.out.println(itemLocacaoDAO.selecionarTodosItens(locacaoModel.getCodigoLocacao()));
        locacaoView.refreshTableItensLocacao();
        locacaoModel.setValorTotalLocacao(locacaoModel.getValorTotalLocacao() - itemLocacaoModel.getValorItem());
        locacaoView.setValorTotalLocacao(locacaoModel.getValorTotalLocacao());
    }

    @Override
    public void habilitarEdicao(boolean arg) {
//        locacaoView.enableTxtLocacaoCodigo(arg);  
//        locacaoView.enableTxtLocacaoRazaoSocial(arg); 
//        locacaoView.enableTxtLocacaoCnpj(arg); 
//        locacaoView.enableTxtLocacaoInscriacaoEstadual(arg);  
//        locacaoView.enableTxtLocacaoEndereco(arg);
//        locacaoView.enableTxtLocacaoBairro(arg);
//        locacaoView.enableTxtLocacaoCidade(arg);
//        locacaoView.enableTxtLocacaoEstado(arg);
//        locacaoView.enableTxtLocacaoTelefone(arg);
//        locacaoView.enableTxtLocacaoEmail(arg);
//        
//        locacaoView.enableBtnCancelar(arg);
//        locacaoView.enableBtnRemover(arg);
//        locacaoView.enableBtnSalvar(arg);        
    }

    @Override
    public ILocacaoView getLocacaoView() {
        return locacaoView;
    }
    
    @Override
    public LocacaoModel getLocacaoModel() {
        return locacaoModel;
    }
    
    @Override
    public void setLocacaoView(ILocacaoView locacaoView) {
        this.locacaoView = locacaoView;
    }

    @Override
    public void setLocacaoModel(LocacaoModel model) {
        this.locacaoModel = model;
    }
    
    @Override
    public ILocacaoBO getLocacaoBO() {
        return locacaoBO;
    }
    
    @Override
    public void setLocacaoBO(ILocacaoBO locacaoBO) {
        this.locacaoBO = locacaoBO;
    }
   
    @Override
    public void createView() {
        this.novoLocacao();            
        this.setUpViewListeners();  

        locacaoModel.setTabelaPrecoLocacao("Diaria");
        locacaoView.removeAllitensComboDescricaoProduto();
        locacaoView.removeAllitensComboNomeCliente();
        locacaoView.removeAllitensComboTabelaPreco();
        locacaoView.setListaCliente(clienteModel.getListaClientes());
        locacaoView.setListaTabelaPreco(locacaoModel.getTabelaPreco());
        locacaoView.setListaProduto(produtoModel.getlistaProdutos());
        locacaoView.setItensLocacaoTableModel(new ItensLocacaoTableModel(null));
        locacaoView.enableBtnCancelarLocacao(false);
        locacaoView.enableBtnSalvarLocacao(false);
        locacaoView.enableBtnCancelarItem(false);
        locacaoView.enableBtnSalvarItem(false);
        locacaoView.enableBtnRemoverItem(false);
        locacaoView.enableBtnInserirItem(false);
        locacaoView.packAndShow();
    }
   
    public void setOperacao(Strategy operacao) {
        this.operacao = operacao;
    }

    public Strategy getOperacao() {
        return operacao;
    }

     private class InsertStrategy implements Strategy {  
        @Override
        public void execute() {  
            inserirLocacao();  
        }  
    }
     
     private class RemoveItemStrategy implements Strategy {  
        @Override
        public void execute() {  
            removerItemLocacao();  
        }  
    }
     
     private class InsertItemStrategy implements Strategy {  
        @Override
        public void execute() {  
            
            inserirItemLocacao();  
        }  
    }
      
    private class UpdateStrategy implements Strategy {  
        @Override
        public void execute() {  
            alterarLocacao();  
        }  
    }
    

}
